home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / TEX-UTIL / DVI_DVI1 / dvilj / c / dviconv < prev    next >
Text File  |  1996-02-20  |  18KB  |  491 lines

  1. #include "dvilj.h"
  2.  
  3.  
  4. /*-->ActualFactor*/
  5. /**********************************************************************/
  6. /**************************  ActualFactor  ****************************/
  7. /**********************************************************************/
  8. double  /* compute the actual size factor given the approximation */
  9. ActualFactor(long4 unmodsize)       /* actually factor * 1000 */
  10. {
  11.     double  realsize;     /* the actual magnification factor */
  12.     realsize = (double)unmodsize / 1000.0;
  13.     if (abs((int)(unmodsize - 1095l))<2)
  14.         realsize = 1.095445115; /*stephalf*/
  15.     else if (abs((int)(unmodsize - 1315l))<2)
  16.         realsize = 1.31453414; /*stepihalf*/
  17.     else if (abs((int)(unmodsize - 1577l))<2)
  18.         realsize = 1.57744097; /*stepiihalf*/
  19.     else if (abs((int)(unmodsize - 1893l))<2)
  20.         realsize = 1.89292916; /*stepiiihalf*/
  21.     else if (abs((int)(unmodsize - 2074l))<2)
  22.         realsize = 2.0736;   /*stepiv*/
  23.     else if (abs((int)(unmodsize - 2488l))<2)
  24.         realsize = 2.48832;  /*stepv*/
  25.     else if (abs((int)(unmodsize - 2986l))<2)
  26.         realsize = 2.985984; /*stepvi*/
  27.     /* the remaining magnification steps are represented with sufficient
  28.        accuracy already */
  29.     return(realsize);
  30. }
  31.  
  32.  
  33. /*-->DecodeArgs*/
  34. /*********************************************************************/
  35. /***************************** DecodeArgs ****************************/
  36. /*********************************************************************/
  37. void
  38. DecodeArgs(int argc, char *argv[] )
  39. {
  40.     int     argind;            /* argument index for flags      */
  41.     char    curarea[STRSIZE];  /* current file area             */
  42.     char    curname[STRSIZE];  /* current file name             */
  43.     char    *tcp, *tcp1;       /* temporary character pointers  */
  44.     char    *this_arg;
  45.     int     ddi;
  46.     double  x_offset=0.0, y_offset=0.0;
  47.  
  48. #ifndef KPATHSEA
  49.     if ((tcp = getenv("TEXPXL")) != NULL) PXLpath = tcp;
  50. #ifdef LJ_RESIDENT_FONTS
  51.     if ((tcp = getenv("TFMFONTS")) != NULL)
  52.       TFMpath = tcp;
  53.     else if ((tcp = getenv("TEXFONTS")) != NULL)
  54.       TFMpath = tcp;
  55. #endif
  56. #endif
  57.  
  58.     argind = 1;
  59.     while (argind < argc) {
  60.         tcp = argv[argind];
  61.         if (*tcp == '-') {
  62.             ++tcp;
  63.             switch (*tcp) {
  64. #ifdef IBM3812
  65.             case 'b':       /* first page from alternate casette */
  66.                 FirstAlternate = _TRUE;
  67.                 break;
  68. #endif
  69.             case 'c':       /* number of copies to print */
  70.                 if ( sscanf(tcp + 1, "%hd", &ncopies) != 1 )
  71.                    Fatal("Argument of -c is not a valid integer\n");
  72.                 if (ncopies<1) {
  73.                   Warning("argument of -c < 1; set to 1!");
  74.                   ncopies=1;
  75.                 }
  76.                 break;
  77. #ifdef DEBUG
  78.             case '-':       /* - selects Debug output */
  79.         tcp++;
  80.         if (*tcp == 'D') {
  81.           Debug = _TRUE;
  82. #ifdef KPATHSEA
  83.                   sscanf (tcp + 1, "%u", &kpathsea_debug);
  84. #endif
  85.                 }
  86.                 break;
  87. #endif
  88. #ifdef LJ2P
  89.             case 'd':       /* d selects DUPLEX mode  */
  90.         tcp++;
  91.         if (*tcp == '1' ) DuplexMode = 1;
  92.         else if (*tcp == '2') DuplexMode = 2;
  93.                 else {
  94.           Warning("Invalid DUPLEX mode, assuming DUPLEX=1, Long-Edge Binding");
  95.           DuplexMode = 1;
  96.         }
  97.                 break;
  98. #endif
  99.             case 'D':       /* D selects DoublePage  */
  100.                 DoublePage = _TRUE;
  101.         tcp++;
  102.         if (*tcp == '1' || *tcp == '2') {
  103.           if (*tcp == '2') PrintFirstPart = _FALSE;
  104.           else             PrintSecondPart = _FALSE;
  105.           tcp++;
  106.         }
  107.         if (*tcp == '-') PrintEmptyPages = _FALSE;
  108.                 break;
  109. #ifdef LJ4
  110.             case 'E':       /* do not reset printer (go) */
  111.                 econoMode = _TRUE;
  112.                 break;
  113. #endif
  114.             case 'e':       /* emit file is specified */
  115.                 EmitFileName = ++tcp;
  116. #ifdef MSDOS
  117.                 /* delete trailing ':' (causing hangup) */
  118.                 if (EmitFileName[strlen(EmitFileName)-1] == ':')
  119.                     EmitFileName[strlen(EmitFileName)-1] = '\0';
  120. #endif
  121. #ifdef OS2  /* repeated to avoid problems with stupid c preprocessors  */
  122.                 /* delete trailing ':' (causing hangup) */
  123.                 if (EmitFileName[strlen(EmitFileName)-1] == ':')
  124.                     EmitFileName[strlen(EmitFileName)-1] = '\0';
  125. #endif
  126.                 break;
  127.             case 'f':       /* next arg is starting pagenumber */
  128.                 if ( sscanf(tcp + 1, "%ld", &FirstPage) != 1 )
  129.                     Fatal("Argument is not a valid integer\n");
  130.                 FirstPageSpecified = _TRUE;
  131.                 break;
  132. #ifdef LJ
  133.             case 'g':       /* do not reset printer (go) */
  134.                 ResetPrinter = _FALSE;
  135.                 break;
  136. #endif
  137.             case 'h':     /* copy header file through to output  */
  138.                 HeaderFileName = ++tcp;
  139.                 G_header = _TRUE;
  140.                 break;
  141. #if defined(LJ2P) || defined(IBM3812)
  142.             case 'l':       /* landscape  */
  143.                 Landscape = _TRUE;
  144.                 break;
  145. #endif
  146. #ifdef MAKETEXPK
  147.         case 'M':
  148.         /* -M, -M1 => don't make font; -M0 => do.  */
  149.             makeTexPK = *(tcp + 1) == '0';
  150.             break;
  151. #endif
  152.             case 'x':       /* specify x-offset */
  153.                 this_arg = 0;
  154.                 if (!(*++tcp)) {
  155.                     this_arg = (++argind >= argc ? 0 : argv[argind]);
  156.                 } else {
  157.                     this_arg = tcp;
  158.                 }
  159.                 if (!this_arg
  160.                      || sscanf(this_arg,"%lf", &x_offset) != 1)
  161.          Fatal("Argument of -x is not a valid floating point number\n");
  162.                 break;
  163.             case 'y':       /* specify y-offset */
  164.                 this_arg = 0;
  165.                 if (!(*++tcp)) {
  166.                     this_arg = (++argind >= argc ? 0 : argv[argind]);
  167.                 } else {
  168.                     this_arg = tcp;
  169.                 }
  170.                 if (!this_arg || sscanf(this_arg, "%lf", &y_offset) != 1)
  171.                 Fatal("Argument of -y is not a valid floating point number\n");
  172.                 break;
  173.             case 'X':       /* specify X-origin in dots */
  174.                 this_arg = 0;
  175.                 if (!(*++tcp)) {
  176.                     this_arg = (++argind >= argc ? 0 : argv[argind]);
  177.                 } else {
  178.                     this_arg = tcp;
  179.                 }
  180.                 if (!this_arg || sscanf(this_arg,"%hd", &x_origin) != 1)
  181.                    Fatal("Argument of -X is not a valid integer\n");
  182.                 break;
  183.             case 'Y':       /* specify Y-origin in dots */
  184.                 this_arg = 0;
  185.                 if (!(*++tcp)) {
  186.                     this_arg = (++argind >= argc ? 0 : argv[argind]);
  187.                 } else {
  188.                     this_arg = tcp;
  189.                 }
  190.                 if (!this_arg ||
  191.                      sscanf(this_arg, "%hd", &y_origin) != 1)
  192.                         Fatal("Argument of -Y is not a valid integer\n");
  193.                 break;
  194.             case 'm':       /* specify magnification to use */
  195.                 switch ( (*++tcp) ) {
  196.                 case '#':
  197.                      /* next arg is a magnification to use */
  198.                     if ( sscanf(tcp + 1, "%ld", &usermag) != 1 )
  199.                        Fatal("Argument of mag is not a valid integer\n");
  200.                     break;
  201.                 case '0':
  202.                     usermag = 1000;
  203.                     break;
  204.                 case 'h':
  205.                 case 'H':
  206.                     usermag = 1095;
  207.                     break;
  208.                 case '1':
  209.                     usermag = 1200;
  210.                     break;
  211.                 case 'q':
  212.                     usermag = 1250;
  213.                     break;
  214.                 case '2':
  215.                     usermag = 1440;
  216.                     break;
  217.                 case '3':
  218.                     usermag = 1728;
  219.                     break;
  220.                 case '4':
  221.                     usermag = 2074;
  222.                     break;
  223.                 case '5':
  224.                     usermag = 2488;
  225.                     break;
  226.                 default:
  227.                     Fatal("%c is a bad mag step\n", *tcp);
  228.                 }
  229.                 break;
  230. #ifdef SUPERCOMMENT
  231.             case 'o':     /* PostScript command to send */
  232.                 if ( ++argind >= argc )
  233.                     Fatal("No argument following -o\n", 0);
  234.                 PScmd[nps++] = argv[argind];
  235.                 break;
  236. #endif
  237.             case 'p':       /* print n pages  */
  238.                 if ( sscanf(tcp + 1, "%ld", &PrintPages) != 1 )
  239.                     Fatal("Argument is not a valid integer\n");
  240.                 if (PrintPages < 1)
  241.                   Fatal("Argument of -p must be greater than 0\n");
  242.                 break;
  243.             case 'q':       /* quiet operation */
  244.                 G_quiet = _TRUE;
  245.                 break;
  246.             case 'r':       /* switch order to process pages */
  247.                 Reverse = (bool)(!Reverse);
  248.                 break;
  249. #ifdef LJ
  250.             case 's':       /* specify X-origin in dots */
  251.                 this_arg = 0;
  252.                 if (!(*++tcp)) this_arg = (++argind >= argc ? 0 : argv[argind]);
  253.                 else           this_arg = tcp;
  254.                 if (!this_arg || sscanf(this_arg,"%hd", &pagesize) != 1)
  255.                    Fatal("Argument of -s is not a valid integer\n");
  256. /*
  257.  * The original pgsiz_dots assumed  a resolution of 300dpi. This loses
  258.  * at 600dpi so we must scale all.
  259.  */
  260.                 switch (pagesize) {
  261. /*
  262.  * The original pgsiz_dots assumed  a resolution of 300dpi. This loses
  263.  * at 600dpi so we must scale all.
  264.  */
  265.                 case 1: pgsiz_dots = 3150; break;         /* executive */
  266.                 case 2: pgsiz_dots = 3300; break;         /* letter */
  267.                 case 3: pgsiz_dots = 4200; break;         /* legal */
  268.                 case 26: pgsiz_dots = 3507; break;        /* a4 */
  269.                 case 80: pgsiz_dots = 2250; break;        /* monarc */
  270.                 case 81: pgsiz_dots = 2850; break;        /* com10 */
  271.                 case 90: pgsiz_dots = 2598; break;        /* int dl */
  272.                 case 91: pgsiz_dots = 2704; break;        /* int c5 */
  273.                 default: Fatal(
  274. #ifndef vms
  275.                    "%hd is a bad value for pagesize (1,2,3,26,80,81,90,91)",
  276. #else
  277.                    "%d is a bad value for pagesize (1,2,3,26,80,81,90,91)",
  278. #endif
  279.                    pagesize);
  280.                 }
  281.                 break;
  282. #endif
  283.             case 't':       /* ending pagenumber */
  284.                 if ( sscanf(tcp + 1, "%ld", &LastPage) != 1 )
  285.                     Fatal("Argument is not a valid integer\n");
  286.                 LastPageSpecified = _TRUE;
  287.                 break;
  288.             case 'v':    /* verbatim mode (print pxl-file names) */
  289.                 G_noverbatim = _FALSE;
  290.                 break;
  291.             case 'w':       /* don't print out warnings */
  292.                 G_nowarn = _TRUE;
  293.                 break;
  294. #ifdef LJ
  295.             case 'z':
  296.                 PrintTestPage = (bool)(!PrintTestPage);
  297.                 break;
  298. #endif
  299. #ifdef LJ4
  300.             case 'R':       /* number of copies to print */
  301.                 if ( sscanf(tcp + 1, "%d", &RESOLUTION) != 1 )
  302.                    Fatal("Argument of -R is not a valid integer\n");
  303.                 if (RESOLUTION != 300 && RESOLUTION != 600 ) {
  304.                   Warning("Resolution must be 300 or 600! Assuming 300.dpi.");
  305.                   RESOLUTION=300;
  306.                 } else {
  307.           if (RESOLUTION == 600) {
  308.             MFMODE = MFMODE600;
  309.             x_origin = 600;
  310.             y_origin = 600;
  311.           }
  312.         }
  313.                 break;
  314. #endif
  315. #ifdef __riscos
  316.             case 'i': /* name of directory to store diagrams in */
  317.                 tcp++; ddi=0;
  318.                 while ((*tcp != ' ') && (*tcp != '\0') && (ddi < DIAGDIRSIZE-1)) {
  319.                   diagdir[ddi++] = *tcp++;
  320.                 }
  321.                 diagdir[ddi] = '\0';
  322.                 break;
  323.         case 'j': /* don't print digrams */
  324.             printdiag = _FALSE;
  325.             case 'k': /* cache diagram bitmap in document folder */
  326.                 cachediag = _TRUE;
  327.                 break;
  328. #endif
  329.             default:
  330.                 fprintf(ERR_STREAM, "%c is not a legal flag\n", *tcp);
  331.             }
  332.         } else {
  333.  
  334.             (void) strcpy(filename, tcp);
  335.         if(!strcmp(filename, "-")) {
  336.            EmitFileName="-";
  337.           #ifdef RISC_USE_OSL
  338.           dvifp = BINOPEN("Kbd:");
  339.           #else
  340.           dvifp=stdin;
  341.           #endif
  342.         } else {
  343.           tcp = strrchr(argv[argind], '/');
  344.           /* split into directory + file name */
  345.           if (tcp == NULL)  {
  346.                 curarea[0] = '\0';
  347.                 tcp = argv[argind];
  348.           } else {
  349.                 (void) strcpy(curarea, argv[argind]);
  350.                 curarea[tcp-argv[argind]+1] = '\0';
  351.                 tcp += 1;
  352.           }
  353.  
  354.           (void) strcpy(curname, tcp);
  355.           /* split into file name + extension */
  356.           tcp1 = strrchr(tcp, '.');
  357.           if (tcp1 == NULL) {
  358.                 (void) strcpy(rootname, curname);
  359.                 strcat(curname, ".dvi");
  360.           } else {
  361.                 *tcp1 = '\0';
  362.                 (void) strcpy(rootname, curname);
  363.                 *tcp1 = '.';
  364.           }
  365.  
  366.           (void) strcpy(filename, curarea);
  367.           (void) strcat(filename, curname);
  368.  
  369.           if ((dvifp = BINOPEN(filename)) == FPNULL)  {
  370.         /* do not insist on .dvi */
  371.         if (tcp1 == NULL)  {
  372.           curname[strlen (curname) - 4] = '\0';
  373.           filename[strlen (filename) - 4] = '\0';
  374.         }
  375.         if (tcp1 != NULL || (dvifp = BINOPEN(filename)) == FPNULL)  {
  376.           perror (filename);
  377.           exit (EXIT_FAILURE);
  378.         }
  379.           }
  380.         } /* dvi filename != '-" */
  381.         }
  382.         argind++;
  383.     }
  384.  
  385. #ifdef LJ4
  386.     pgsiz_dots *= (int)(RESOLUTION/300); /* rescale dots to page */
  387. #endif
  388.     x_goffset = (short) MM_TO_PXL(x_offset) + x_origin;
  389.     y_goffset = (short) MM_TO_PXL(y_offset) + y_origin;
  390.  
  391.     if (dvifp == FPNULL)  {
  392.       fprintf(ERR_STREAM,"\nThis is the DVI to %s converter version %s",
  393.           PRINTER, VERSION);
  394. #ifdef SEVENBIT
  395.       fprintf(ERR_STREAM,", 7bit");
  396. #endif
  397.       fprintf(ERR_STREAM," (%s)\n", OS);
  398.       fprintf(ERR_STREAM,"usage: %s [OPTIONS] dvifile\n", G_progname);
  399.  
  400.       fprintf(ERR_STREAM,"OPTIONS are:\n");
  401. #ifdef DEBUG
  402.       fprintf(ERR_STREAM,"\t--D ..... turns debug output on\n");
  403. #endif
  404.       fprintf(ERR_STREAM,
  405.         "\t-aX ..... X= searchpath leading to pixel-files (.pk or .pxl)\n");
  406. #ifdef IBM3812
  407.       fprintf(ERR_STREAM,
  408.         "\t-b  ..... take paper for first page from alternate casette\n");
  409. #endif
  410.       fprintf(ERR_STREAM,"\t-cX ..... X= number of copies\n");
  411. #ifdef LJ2P
  412.       fprintf(ERR_STREAM,"\t-dX ..... duplex, X=1: long-edge, 2: short-edge binding\n");
  413. #endif
  414.       fprintf(ERR_STREAM,"\t-D  ..... turns doublepage output on; ");
  415.       fprintf(ERR_STREAM,"-D1 odd pages only, -D2 even\n");
  416. #ifdef LJ4
  417.       fprintf(ERR_STREAM,"\t-E  ..... print in econo-mode\n");
  418. #endif
  419.       fprintf(ERR_STREAM,"\t-eX ..... X= output file\n");
  420.       fprintf(ERR_STREAM,"\t-fX ..... print from begin of page number X\n");
  421. #ifdef LJ
  422.       fprintf(ERR_STREAM,
  423.           "\t-g  ..... do not reset printer at begin of job (go)\n");
  424. #endif
  425.       fprintf(ERR_STREAM,"\t-hX ..... X= name of headerfile\n");
  426. #ifdef __riscos
  427.       fprintf(ERR_STREAM,"\t-iX ..... name of dir to cache diagrams in\n");
  428.       fprintf(ERR_STREAM,"\t-j  ..... don't print diagrams\n");
  429.       fprintf(ERR_STREAM,"\t-k  ..... cache diagram bitmaps\n");
  430. #endif
  431. #ifdef LJ2P
  432.       fprintf(ERR_STREAM,"\t-l  ..... landscape mode\n");
  433. #endif
  434. #ifdef MAKETEXPK
  435.       fprintf(ERR_STREAM,"\t-MX ..... Don't generate missing PK files\n");
  436. #endif
  437.       fprintf(ERR_STREAM,"\t-mX ..... magnification X=0;h;1;2;3;4;5;#xxxx\n");
  438.       fprintf(ERR_STREAM,"\t-pX ..... print X pages\n");
  439.       fprintf(ERR_STREAM,"\t-q  ..... quiet operation\n");
  440.       fprintf(ERR_STREAM,"\t-r  ..... process pages in reverse order\n");
  441. #ifdef LJ4
  442.       fprintf(ERR_STREAM,"\t-RX ..... set resolution to 300 or 600 dpi\n");
  443. #endif
  444. #ifdef LJ
  445.       fprintf(ERR_STREAM,"\t-sX ..... set paper size to X (see documentation)\n");
  446. #endif
  447.       fprintf(ERR_STREAM,"\t-tX ..... print to end of page number X\n");
  448.       fprintf(ERR_STREAM,"\t-v  ..... tell user which pixel-files are used\n");
  449.       fprintf(ERR_STREAM,"\t-w  ..... don't print out warnings\n");
  450.       fprintf(ERR_STREAM,"\t-xX ..... X= x-offset on printout in mm\n");
  451.       fprintf(ERR_STREAM,"\t-yX ..... X= y-offset on printout in mm\n");
  452.       fprintf(ERR_STREAM,"\t-XO ..... O= x page origin in dots (default=%d)\n",
  453.             XDEFAULTOFF );
  454.       fprintf(ERR_STREAM,"\t-YO ..... O= y page origin in dots (default=%d)\n",
  455.             YDEFAULTOFF );
  456. #ifdef LJ
  457.       fprintf(ERR_STREAM,
  458.           "\t-z  ..... print test page with pagecounter after job\n");
  459. #endif
  460.       fprintf(ERR_STREAM,
  461.       "\t-   ..... dvifile is stdin (must be seekable); implies -e-\n");
  462.       exit(1);
  463.     }
  464.     if (EQ(EmitFileName, "")) {
  465.         if ((EmitFileName = (char *)malloc( STRSIZE )) != NULL)
  466.             allocated_storage += STRSIZE;
  467.         else
  468.             Fatal("Can't allocate storage of %d bytes\n",STRSIZE);
  469.         (void) strcpy(EmitFileName, curname);
  470.         if ((tcp1 = strrchr(EmitFileName, '.')))
  471.       *tcp1 = '\0';
  472.     strcat(EmitFileName, EMITFILE_EXTENSION);
  473.     }
  474. }
  475.  
  476.  
  477. /*-->DoConv*/
  478. /*********************************************************************/
  479. /********************************  DoConv  ***************************/
  480. /*********************************************************************/
  481. long4
  482. DoConv(long4 num, long4 den, int convResolution)
  483. {
  484.     /*register*/ double conv;
  485.     conv = ((double)num / (double)den) *
  486.             ((double)mag / 1000.0) *
  487.           ((double)convResolution/254000.0);
  488.  
  489.     return((long4) ((1.0/conv)+0.5));
  490. }
  491.